home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Precision Software Appli…tions Silver Collection 1
/
Precision Software Applications Silver Collection Volume One (PSM) (1993).iso
/
tutor
/
typteach.exe
/
PC-TOUCH.BAS
< prev
next >
Wrap
BASIC Source File
|
1985-03-19
|
12KB
|
410 lines
100 '
200 ' PC-TOUCH ---- Program to help you practice touch-typing,
300 ' by Dean Hannotte (July, 1983).
400 '
500 ' This program has been given free of charge and "as is" to the
600 ' New York IBM Personal Computer User Group. Please share it with as
700 ' many people as you like. If you'd like to request enhancements, or
800 ' just want to talk about it, I can be reached at (212) 674-5848 be-
900 ' tween 9AM and 9PM.
1000 '
1100 ' I also do contract programming.
1200 '
1300 ' Constants:
1400 '
1500 Y = -1 : N = 0 'Logical variables
1600 ENTER$ = CHR$(17)+CHR$(196)+CHR$(217) 'Picture of ENTER key
1700 ESC$ = "ESC" 'Picture of ESC key
1800 F1$ = "F1" 'Picture of F1 key
1900 '
2000 CR$ = CHR$(13) 'Carriage return character
2100 CURSOR$ = CHR$(95) 'Cursor character
2200 '
2300 ' System Variables:
2400 '
2500 TRACE = N 'Display critical variables?
2600 '
2700 ' Execution-time Parameters:
2800 '
2900 NO.SOUND = N 'Silent operation?
3000 NO.MUSIC = Y 'Musical keyboard?
3100 'COLOR Foreground/Background settings for all monitor types:
3200 WHITE = 7
3300 BLACK = 0
3400 HILIT = 8 'Add this to foreground white only
3500 BLINK = 16 'Add this to foreground white only
3600 GOTO 14600 'Branch around subroutines
3700 '
3800 ' Wait for Keystroke Subroutine:
3900 '
4000 INK$ = INKEY$
4100 IF INK$ <> "" GOTO 4600
4200 COLOR BLACK,WHITE
4300 LOCATE 22,37
4400 PRINT TIME$;
4500 GOTO 4000
4600 IF LEN(INK$) = 2 GOTO 5200 'Special key hit
4700 IF INK$ = CR$ GOTO 5100 'ENTER key hit
4800 IF ASC(INK$) = 27 GOTO 35300 'ESC key hit
4900 IF ASC(INK$) < 32 GOTO 4000 'Ignore control characters
5000 IF ASC(INK$) > 126 GOTO 4000 '
5100 RETURN
5200 IF ASC(RIGHT$(INK$,1)) = 59 GOTO 5400 'F1 key hit
5300 GOTO 4000
5400 IF NOT HALTABLE GOTO 4000
5500 HALT.HH = VAL(LEFT$(TIME$,2))
5600 HALT.MM = VAL(MID$(TIME$,4,2))
5700 HALT.SS = VAL(RIGHT$(TIME$,2))
5800 LOCATE 20,34
5900 COLOR BLACK+BLINK,WHITE
6000 PRINT F1$;
6100 IF NOT TRACE GOTO 6500
6200 LOCATE 21,52
6300 COLOR WHITE,BLACK
6400 PRINT "H:" HALT.HH HALT.MM HALT.SS;
6500 INK$ = INKEY$
6600 IF INK$ <> "" GOTO 7100
6700 LOCATE 22,37
6800 COLOR BLACK,WHITE
6900 PRINT TIME$;
7000 GOTO 6500
7100 IF LEN(INK$) <> 2 GOTO 6500
7200 IF ASC(RIGHT$(INK$,1)) <> 59 GOTO 6500
7300 RESTART.HH = VAL(LEFT$(TIME$,2))
7400 RESTART.MM = VAL(MID$(TIME$,4,2))
7500 RESTART.SS = VAL(RIGHT$(TIME$,2))
7600 IF NOT TRACE GOTO 8000
7700 LOCATE 21,67
7800 COLOR WHITE,BLACK
7900 PRINT "R:" RESTART.HH RESTART.MM RESTART.SS;
8000 CHANGE.HH = RESTART.HH-HALT.HH
8100 CHANGE.MM = RESTART.MM-HALT.MM
8200 CHANGE.SS = RESTART.SS-HALT.SS
8300 IF CHANGE.SS < 0 THEN CHANGE.SS = CHANGE.SS+60:CHANGE.MM = CHANGE.MM-1
8400 IF CHANGE.MM < 0 THEN CHANGE.MM = CHANGE.MM+60:CHANGE.HH = CHANGE.HH-1
8500 IF CHANGE.HH < 0 THEN CHANGE.HH = CHANGE.MM+24
8600 START.SS = START.SS+CHANGE.SS
8700 START.MM = START.MM+CHANGE.MM
8800 START.HH = START.HH+CHANGE.HH
8900 IF START.SS > 59 THEN START.SS = START.SS-60:START.MM = START.MM+1
9000 IF START.MM > 59 THEN START.MM = START.MM-60:START.HH = START.HH+1
9100 LOCATE 20,34
9200 COLOR BLACK,WHITE
9300 PRINT F1$;
9400 IF NOT TRACE GOTO 9800
9500 LOCATE 21,35
9600 COLOR WHITE,BLACK
9700 PRINT "S:" START.HH START.MM START.SS;
9800 GOTO 4000
9900 '
10000 ' Update Line Statistics Subroutine:
10100 '
10200 COLOR BLACK,WHITE
10300 LOCATE 23,36
10400 PRINT DATE$
10500 IF KEY.STROKES = 0 GOTO 10700
10600 ACCURACY = (KEY.STROKES-ERRORS)*100/KEY.STROKES
10700 LOCATE 22,72
10800 PRINT USING "###.##";ACCURACY
10900 HH = VAL(LEFT$(TIME$,2))
11000 MM = VAL(MID$(TIME$,4,2))
11100 SS = VAL(RIGHT$(TIME$,2))
11200 IF SS < START.SS THEN SS = SS+60:MM=MM-1
11300 IF MM < START.MM THEN MM = MM+60:HH=HH-1
11400 IF HH < START.HH THEN HH = HH+24
11500 TOTAL.SS = SS-START.SS
11600 TOTAL.SS = TOTAL.SS+60*(MM-START.MM)
11700 TOTAL.SS = TOTAL.SS+3600*(HH-START.HH)
11800 TOTAL.MM = TOTAL.SS/60
11900 TOTAL.HH = TOTAL.SS/3600
12000 WPM = WORDS/TOTAL.MM
12100 LOCATE 23,72
12200 PRINT USING "###.##";WPM
12300 IF NOT TRACE GOTO 12700
12400 LOCATE 21,12
12500 COLOR WHITE,BLACK
12600 PRINT USING "MINUTES: ###.##"; TOTAL.MM
12700 RETURN
12800 '
12900 ' Hit ENTER to go on Subroutine:
13000 '
13100 PRINT
13200 PRINT
13300 LOCATE ,33
13400 PRINT "Hit ";
13500 COLOR BLACK+BLINK,WHITE
13600 PRINT ENTER$;
13700 COLOR WHITE,BLACK
13800 PRINT " to go on";
13900 R = CSRLIN
14000 GOSUB 4000 'Wait for ENTER
14100 IF INK$ <> CR$ GOTO 14000
14200 COLOR WHITE,BLACK
14300 LOCATE R,1
14400 PRINT SPACE$(79)
14500 RETURN
14600 '
14700 ' Start doing things:
14800 '
14900 COLOR WHITE,BLACK
15000 CLS
15100 KEY OFF
15200 PLAY "mb ms l64"
15300 COLOR BLACK,WHITE
15400 LOCATE 1,1,0
15500 PRINT "PC-TOUCH " STRING$(28,"-");
15600 PRINT " Program to help you practice touch-typing"
15700 LOCATE 22,1
15800 PRINT "Keystrokes 0" SPACE$(42);
15900 PRINT "Accuracy 100.00 %"
16000 LOCATE 23,1
16100 PRINT "Errors 0" SPACE$(42);
16200 PRINT "Words/Minute 0.00 "
16300 LOCATE 22,37
16400 PRINT TIME$
16500 LOCATE 23,36
16600 PRINT DATE$
16700 R = 1
16800 COLOR WHITE,BLACK
16900 LOCATE 20,1
17000 PRINT "Hit ";
17100 COLOR BLACK,WHITE
17200 PRINT ENTER$;
17300 COLOR WHITE,BLACK
17400 PRINT " to go on";
17500 LOCATE ,30
17600 PRINT "Hit ";
17700 COLOR BLACK,WHITE
17800 PRINT F1$;
17900 COLOR WHITE,BLACK
18000 PRINT " to Halt/Restart";
18100 LOCATE ,65
18200 PRINT "Hit ";
18300 COLOR BLACK,WHITE
18400 PRINT ESC$;
18500 COLOR WHITE,BLACK
18600 PRINT " to stop"
18700 LOCATE R+3,6
18800 PRINT "This program will display on the screen lines of";
18900 PRINT " text for you to type."
19000 PRINT "You can't correct mistakes as you go along, because that";
19100 PRINT " won't help you learn"
19200 PRINT "how not to make them in the first place. Just do the best";
19300 PRINT " you can, and as you"
19400 PRINT "continue you will find yourself making fewer and fewer";
19500 PRINT " errors. And remember"
19600 PRINT "that when you are just learning to type, accuracy is more";
19700 PRINT " important than speed."
19800 FOR K = 1 TO 1
19900 KEY K,""
20000 NEXT K
20100 '
20200 ' FINDFILE -- Routine for dynamically allocating input files:
20300 '
20400 MAX.F = 0
20500 DIM FILENAME$(1),FILEID$(1)
20600 FILENAME$(0) = "pc-touch.fil"
20700 FOR F = 0 TO MAX.F
20800 FOR M = 0 TO 7
20900 MODE$ = CHR$(ASC("a")+M)
21000 FILEID$(F) = MODE$+":"+FILENAME$(F)
21100 ON ERROR GOTO 21500
21200 OPEN FILEID$(F) FOR INPUT AS #1
21300 ON ERROR GOTO 0
21400 GOTO 21900
21500 RESUME 21600
21600 NEXT M
21700 FILEID$(F) = ""
21800 GOTO 22000
21900 CLOSE #1
22000 NEXT F
22100 FOR F = 0 TO MAX.F
22200 IF FILEID$(F) <> "" GOTO 22700
22300 IF FINDFILE.FAILED GOTO 22600
22400 FINDFILE.FAILED = -1
22500 CLS
22600 PRINT "*** CAN'T FIND " FILENAME$(F) " FILE ***"
22700 NEXT F
22800 IF NOT FINDFILE.FAILED GOTO 23200
22900 PRINT
23000 PRINT "*** CHANGE DISKETTES AND TRY AGAIN ***"
23100 SYSTEM
23200 '
23300 ' End of FINDFILE Routine:
23400 '
23500 PRINT
23600 PRINT
23700 GOSUB 12800 'Hit ENTER to go on
23800 HALTABLE = Y
23900 COLOR WHITE,BLACK
24000 LOCATE 13,1
24100 PRINT SPACE$(79)
24200 LOCATE 12,21
24300 PRINT "TYPE THE FOLLOWING LINE EXACTLY AS SHOWN:"
24400 START.HH = VAL(LEFT$(TIME$,2))
24500 START.MM = VAL(MID$(TIME$,4,2))
24600 START.SS = VAL(RIGHT$(TIME$,2))
24700 IF NOT TRACE GOTO 25100
24800 LOCATE 21,35
24900 COLOR WHITE,BLACK
25000 PRINT "S:" START.HH START.MM START.SS
25100 '
25200 ' Open (or re-open) the input file:
25300 '
25400 OPEN FILEID$(0) FOR INPUT AS #1
25500 '
25600 ' Read the source file:
25700 '
25800 IF EOF(1) GOTO 34700
25900 LINE INPUT #1,RECORD$
26000 IF RECORD$ = "" GOTO 25800
26100 RC = 0 'Define Record Column within buffer
26200 CC = 41 - LEN(RECORD$)/2 'Define Cursor Column within display area
26300 COLOR WHITE+HILIT,BLACK
26400 LOCATE 14,1
26500 PRINT SPACE$(79)
26600 LOCATE 14,CC
26700 PRINT RECORD$
26800 LOCATE 16,1
26900 PRINT SPACE$(79)
27000 LOCATE 16,CC
27100 PRINT CURSOR$ 'Print a cursor
27200 IN.A.WORD = N
27300 CC = CC - 1
27400 '
27500 ' Wait for a keystroke:
27600 '
27700 RC = RC + 1
27800 CC = CC + 1
27900 GOSUB 4000 'Wait for keystroke
28000 IF INK$ = CR$ GOTO 34200 'ENTER key hit
28100 IF NO.MUSIC GOTO 28700
28200 IF INK$ < "A" OR INK$ > "z" GOTO 28700
28300 IF INK$ > "Z" AND INK$ < "a" GOTO 28700
28400 N = ASC(INK$) - 65
28500 IF INK$ < "a" THEN N = N + 32
28600 PLAY "n=n;"
28700 '
28800 ' Display the character:
28900 '
29000 LOCATE 16,CC
29100 OUTK$ = MID$(RECORD$,RC,1)
29200 IF INK$ <> OUTK$ GOTO 29900
29300 COLOR WHITE+HILIT,BLACK
29400 PRINT INK$;
29500 GOTO 31000
29600 '
29700 ' Flag incorrect character:
29800 '
29900 COLOR BLACK+BLINK,WHITE
30000 PRINT INK$;
30100 ERRORS = ERRORS + 1
30200 COLOR BLACK,WHITE
30300 LOCATE 23,11
30400 PRINT USING "#####,";ERRORS
30500 IF NO.SOUND GOTO 31000
30600 BEEP
30700 '
30800 ' Update keystroke statistics:
30900 '
31000 COLOR WHITE+HILIT,BLACK
31100 LOCATE 16,CC+1
31200 PRINT CURSOR$ 'Print a cursor
31300 KEY.STROKES = KEY.STROKES + 1
31400 COLOR BLACK,WHITE
31500 LOCATE 22,11
31600 PRINT USING "#####,";KEY.STROKES
31700 '
31800 ' See where we are syntactically:
31900 '
32000 IF OUTK$ >= "a" AND OUTK$ <= "z" GOTO 33100
32100 IF OUTK$ >= "A" AND OUTK$ <= "Z" GOTO 33100
32200 IF OUTK$ >= "0" AND OUTK$ <= "9" GOTO 33100
32300 '
32400 ' We're not in a word:
32500 '
32600 IN.A.WORD = N
32700 GOTO 34100
32800 '
32900 ' We're in a word:
33000 '
33100 IF IN.A.WORD GOTO 34100
33200 IN.A.WORD = Y
33300 WORDS = WORDS + 1
33400 IF NOT TRACE GOTO 34100
33500 LOCATE 21,1
33600 COLOR WHITE,BLACK
33700 PRINT "WORDS:" WORDS
33800 '
33900 ' Loop back to read next character:
34000 '
34100 GOTO 27700
34200 '
34300 ' End of line:
34400 '
34500 GOSUB 10200 'Update Line Statistics
34600 GOTO 25500 'Loop back to read next record
34700 '
34800 ' End of File Routine:
34900 '
35000 CLOSE #1
35100 FREE = FRE(" ") 'Reorganize string space
35200 GOTO 25100 'Loop back and re-open the file
35300 '
35400 ' User has hit the ESC key:
35500 '
35600 CLOSE #1
35700 '
35800 ' End of Program:
35900 '
36000 HALTABLE = N
36100 COLOR WHITE,BLACK
36200 FOR R = 2 TO 21
36300 LOCATE R,1
36400 PRINT SPACE$(79)
36500 NEXT R
36600 LOCATE 4,6
36700 PRINT "Thank you for using PC-TOUCH. Feel free to call me at ";
36800 PRINT "212/674-5848 any day"
36900 PRINT "between 9AM and 9PM to talk about:"
37000 PRINT ""
37100 PRINT ""
37200 PRINT TAB(11) "1) this program;"
37300 PRINT TAB(11) "2) the quotations I used;"
37400 PRINT TAB(11) "3) Bach's Chaconne in d-minor;"
37500 PRINT TAB(11) "4) dinosaurs in children's literature;"
37600 PRINT TAB(11) "5) anything that's made your life beautiful lately."
37700 PRINT
37800 PRINT
37900 PRINT TAB(21) "Sincerely,"
38000 PRINT
38100 PRINT TAB(21) "Dean Hannotte"
38200 PRINT TAB(21) "324 East Ninth Street" TAB(55) "(To return to DOS,"
38300 PRINT TAB(21) "New York, NY 10003" TAB(57) "just hit ";
38400 LOCATE ,,0
38500 COLOR BLACK+BLINK,WHITE
38600 PRINT ENTER$;
38700 COLOR WHITE,BLACK
38800 PRINT ")"
38900 LOCATE 8,67:PRINT "\";:LOCATE ,69:PRINT "/"
39000 LOCATE 9,66:PRINT "-- --"
39100 LOCATE 10,67:PRINT "/";:LOCATE ,69:PRINT "\"
39200 COLOR WHITE+HILIT+BLINK,BLACK
39300 LOCATE 7,66:PRINT "*";:LOCATE ,70:PRINT "*"
39400 LOCATE 9,64:PRINT "*";:LOCATE ,72:PRINT "*"
39500 LOCATE 11,66:PRINT "*";:LOCATE ,70:PRINT "*"
39600 GOSUB 4000 'Wait for ENTER
39700 IF INK$ <> CR$ GOTO 39600
39800 COLOR WHITE,BLACK 'Scroll off the screen
39900 LOCATE 23,1 'all but statistics lines.
40000 FOR X = 1 TO 21 '(Must be 21 for BASCOM)
40100 PRINT
40200 NEXT X
40300 SYSTEM
'all but statistics lines.
40000 FOR X = 1 TO 21 '(Must b 21 for BASCOM)
40100 PRINT
40200 NEXT X
40300 SYSTEM
'all but statistics lines.
40000 FOR X = 1 TO 21 '(Must b